//
//  HMSportMapViewController.m
//  HMSport
//
//  Created by apple on 2017/4/21.
//  Copyright © 2017年 itheima. All rights reserved.
//

#import "HMSportMapViewController.h"
#import <AMapFoundationKit/AMapFoundationKit.h>
#import "HMSportTrack.h"

@interface HMSportMapViewController ()<MAMapViewDelegate>

//记录是否添加起点大头针
@property (nonatomic, assign) BOOL hasSetStartAnno;

@end

@implementation HMSportMapViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //为了更好的使第三方类库和项目解耦和,将带界面的功能封装到视图控制器中

    ///初始化地图
    _mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    
    ///把地图添加至view
    [self.view addSubview:_mapView];
    
    //设置地图
    [self setupMapView];
}


- (void)setupMapView{

    /**
     * 高德地图  2D 和 3D 的区别:
     1> 2D 不能旋转 使用的是切片的方式 下载的是地图图片 如果实现旋转会导致内存暴涨(所有的图片都要进行transform)   优缺点: 流量使用大,下载时间长  CPU使用少
     2> 3D 下载的是地图数据  在客户端根据数据进行绘制  数据显示快,CPU使用多 注意避免内存/CPU峰值
     */
    //隐藏标尺
    _mapView.showsScale = NO;
    //关闭3D旋转
    _mapView.rotateCameraEnabled = NO;
    
    ///如果您需要进入地图就显示定位小蓝点，则需要下面两行代码
    _mapView.showsUserLocation = YES;
    _mapView.userTrackingMode = MAUserTrackingModeFollow;
    
    //开始后台运行 注意设置backgroundmode
    _mapView.allowsBackgroundLocationUpdates = YES;
    //取消自动暂停
    _mapView.pausesLocationUpdatesAutomatically = NO;
    
    //设置代理
    _mapView.delegate = self;
    
}

- (void)viewDidLayoutSubviews{

    [super viewDidLayoutSubviews];
    //使用其他视图传递的视图尺寸时,注意在子视图布局完成后进行
    //设置指南针位置 要求指南针中心点和轨迹按钮的中心点保持一致
    _mapView.compassOrigin = CGPointMake(_trackBtnCenter.x - _mapView.compassSize.width * 0.5, _trackBtnCenter.y - _mapView.compassSize.height * 0.5);
}

#pragma mark - setter 

- (void)setMapType:(HMMapType)mapType{

    _mapType = mapType;
    //设置地图类型
    _mapView.mapType = (MAMapType)_mapType;
}

#pragma mark - MAMapViewDelegate

- (void)mapView:(MAMapView *)mapView didFailToLocateUserWithError:(NSError *)error{

    //GPS断开
    //发送gps更新通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"HMSportGPSStateDidChangeNote" object:nil userInfo:@{@"HMSportGPSStateDidChangeNoteGPSStateKey": @(HMSportGPSStateDisconnect)}];
}


//已经更新用户位置后调用
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{

    //过滤掉方向改变触发的更新事件
    if (updatingLocation == NO) {
        
        return;
    }
    
    //位置更新后,发送通知给控制器  使用通知因为多个界面使用数据
    [[NSNotificationCenter defaultCenter] postNotificationName:@"HMSportLocationDidUpdateNote" object:nil userInfo:@{@"HMSportLocationDidUpdateNoteLocationKey": userLocation.location}];
    
    //更新位置后,设置地图中心点
    _mapView.centerCoordinate = userLocation.location.coordinate;
    
    
    //添加起点大头针
    if (_hasSetStartAnno == NO && self.track.startAnno) {
        
        [_mapView addAnnotation:self.track.startAnno];
        _hasSetStartAnno = YES;
    }
    
    
    //生成新的折线  每段起点都是上一段的终点
    HMSportPolyline *newPolyline = [self.track appendPolylineWithDest:userLocation.location];
    
    //添加折线
    [_mapView addOverlay:newPolyline];
    
}


//设置大头针视图时调用
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        static NSString *reuseIndetifier = @"annotationReuseIndetifier";
        MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
        if (annotationView == nil)
        {
            annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIndetifier];
        }
        //设置图片
        annotationView.image = [UIImage imageNamed:self.track.sportTypeImgName];
        //设置中心点偏移，使得标注底部中间点成为经纬度对应点
        annotationView.centerOffset = CGPointMake(0, -annotationView.image.size.height * 0.5);
        return annotationView;
    }
    return nil;
}

//设置覆盖物样式
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay
{
    if ([overlay isKindOfClass:[HMSportPolyline class]])
    {
        MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc] initWithPolyline:overlay];
        //线宽
        polylineRenderer.lineWidth    = 4.f;
        
        //描边颜色 根据折线的速度来改变
        HMSportPolyline *polyline = overlay;
        
        polylineRenderer.strokeColor  = polyline.storkeColor;
        //拐点样式
        polylineRenderer.lineJoinType = kMALineJoinRound;
        //头尾样式
        polylineRenderer.lineCapType  = kMALineCapRound;
        
        return polylineRenderer;
    }
    
    return nil;
}

@end
